# 导入异步相关库
import asyncio

# 导入时间库用于计时
import time


# 导入aiohttp库用于异步HTTP请求
import aiohttp


# 导入requests库用于同步HTTP请求
import requests


# 定义性能比较器类
class PerformanceComparator:
    # 类的说明文档
    """性能比较器"""

    # 定义静态方法用于异步HTTP请求
    @staticmethod
    async def async_http_requests(urls):
        # 方法的说明文档
        """异步HTTP请求"""
        # 创建异步HTTP会话
        async with aiohttp.ClientSession() as session:
            # 初始化任务列表
            tasks = []
            # 遍历每一个url
            for url in urls:
                # 创建GET请求任务
                task = session.get(url)
                # 添加任务到任务列表
                tasks.append(task)
            # 并发执行所有任务并获取响应
            responses = await asyncio.gather(*tasks)
            # 返回所有响应的状态码
            return [resp.status for resp in responses]

    # 定义静态方法用于同步HTTP请求
    @staticmethod
    def sync_http_requests(urls):

        # 方法的说明文档
        """同步HTTP请求"""
        # 初始化结果列表
        results = []
        # 遍历每一个url
        for url in urls:
            # 发送GET请求
            response = requests.get(url)
            # 添加响应状态码到结果列表
            results.append(response.status_code)
        # 返回所有结果
        return results

    # 定义异步方法用于比较性能
    async def compare_performance(self, urls):
        # 方法的说明文档
        """比较性能"""
        # 打印待测试的URL数量
        print(f"测试 {len(urls)} 个URL")

        # --- 同步部分 ---
        # 打印同步测试标题
        print("=== 同步版本 ===")
        # 记录开始时间
        start = time.time()
        # 进行同步HTTP请求
        sync_results = self.sync_http_requests(urls)
        # 计算同步请求耗时
        sync_time = time.time() - start
        # 打印同步请求耗时
        print(f"同步耗时: {sync_time:.2f}秒")

        # --- 异步部分 ---
        # 打印异步测试标题
        print("\n=== 异步版本 ===")
        # 记录开始时间
        start = time.time()
        # 进行异步HTTP请求
        async_results = await self.async_http_requests(urls)
        # 计算异步请求耗时
        async_time = time.time() - start
        # 打印异步请求耗时
        print(f"异步耗时: {async_time:.2f}秒")

        # 计算性能提升倍数
        improvement = sync_time / async_time
        # 打印性能提升结果
        print(f"\n性能提升: {improvement:.2f}x")

        # 返回同步和异步的结果
        return sync_results, async_results


# 定义异步性能演示函数
async def performance():
    # 方法文档说明
    """性能演示"""
    # 使用httpbin.org作为测试URL，重复5次
    urls = ["https://httpbin.org/delay/1"] * 5

    # 创建性能比较器对象
    comparator = PerformanceComparator()
    # 调用性能比较方法并等待结果
    await comparator.compare_performance(urls)


# 启动性能测试
asyncio.run(performance())
